using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using JGSY.CMS.LowCode.Platform.Domain.Interfaces;

namespace JGSY.CMS.LowCode.Platform.Domain.Entities
{
    /// <summary>
    /// 内容模型实体
    /// 用于定义动态内容的结构模板和字段配置
    /// </summary>
    [Table("content_models")]
    public class ContentModel : ITenantEntity
    {
        /// <summary>
        /// 内容模型标识符
        /// </summary>
        [Key]
        public long Id { get; set; }
        
        /// <summary>
        /// 模型名称
        /// 内容模型的显示名称
        /// </summary>
        [Required]
        [StringLength(255)]
        public string Name { get; set; } = string.Empty;
        
        /// <summary>
        /// 模型描述
        /// 对内容模型用途和特点的详细说明
        /// </summary>
        [Column(TypeName = "text")]
        public string? Description { get; set; }
        
        /// <summary>
        /// 字段定义
        /// 以JSON格式存储的字段配置信息
        /// </summary>
        [Column(TypeName = "json")]
        public string Fields { get; set; } = string.Empty;
        
        /// <summary>
        /// 是否激活
        /// 标识该内容模型是否处于激活可用状态
        /// </summary>
        public bool IsActive { get; set; } = true;
        
        /// <summary>
        /// 创建时间
        /// 内容模型的创建时间戳
        /// </summary>
        public DateTime CreatedAt { get; set; }
        
        /// <summary>
        /// 更新时间
        /// 内容模型的最后修改时间戳
        /// </summary>
        public DateTime UpdatedAt { get; set; }
        
        /// <summary>
        /// 作者标识符
        /// 创建该内容模型的用户ID
        /// </summary>
        public long AuthorId { get; set; }
        
        /// <summary>
        /// 作者信息
        /// 导航属性，指向创建该模型的用户
        /// </summary>
        [ForeignKey(nameof(AuthorId))]
        public User? Author { get; set; }
        
        /// <summary>
        /// 内容项集合
        /// 导航属性，包含基于该模型创建的所有内容项
        /// </summary>
        [InverseProperty(nameof(ContentItem.Model))]
        public ICollection<ContentItem> ContentItems { get; set; } = new List<ContentItem>();

        /// <summary>
        /// 租户标识符
        /// </summary>
        public string TenantId { get; set; } = string.Empty;
    }
}
